Istio ServiceEntry

개요

서비스 메시 내의 구성원은 서비스 레지스트리를 통해 서로의 주소를 파악하고 관리한다.
이스티오는 컨트롤 플레인이 이 서비스 레지스트리를 관리하며 각 프록시에게 필요한 주소의 정보를 알려준다.
그러나 이스티오 이그레스 게이트웨이를 만들 때 하나의 문제가 발생하는데, 바로 클러스터 외부의 주소는 서비스 레지스트리에 기본적으로 등록되지 않는 주소라는 점이다.
그래서 서비스 메시 내의 서비스가 아닌 주소를 서비스 레지스트리에 등록하기 위해, 서비스 진입점을 만드는 리소스가 바로 ServiceEntry이다.[1]
이 리소스를 만들면, Gateway나 VirtualService에서 해당 주소에 대해 여러 설정을 할 수 있게 된다.

워크로드 엔트리와의 관계는 조금 더 공부하고 정리하겠다.

ServiceEntry 양식 작성법

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: httpbin-ext
spec:
  hosts:
  - httpbin.org
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  location: MESH_EXTERNAL

어떤 식으로 작성하는지 간단하게 설명한 후에 기능들을 살펴보겠다.
일단 hostsports 필드를 통해 어떤 호스트, 포트를 진입점으로 등록할 것인지 명시한다.

  addresses:
  - 192.192.192.192/24
  endpoints:
  - address: us.foo.bar.com
    ports:
      http: 8080

addresses 필드는 이 진입점으로 들어오기 위한 IP 대역을 나타낸다.
가상 IP라고 보면 되겠다.
endpoints는 실제 트래픽을 보내야할 엔드포인트를 나타낸다.
이 필드가 있으면 기본적으로 서비스 엔트리가 등록될 때 hosts 필드를 이용해 DNS 쿼리를 날리지 않고, 이 주소를 사용한다.

location 필드에는 두 가지 값이 가능하다.

resolution 필드는 프록시가 IP 주소를 알아내어 어떻게 라우팅할지를 지정한다.

예시

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-mongocluster
spec:
  hosts:
  - mymongodb.somedomain # not used
  addresses:
  - 192.192.192.192/24 # VIPs
  ports:
  - number: 27018
    name: mongodb
    protocol: MONGO
  location: MESH_INTERNAL
  resolution: STATIC
  endpoints:
  - address: 2.2.2.2
  - address: 3.3.3.3

addresses 필드로 몽고 디비로 가야할 트래픽 ip 대역을 정했다.
실제 트래픽은 endpoints에 명시된 2.2.2.2, 3.3.3.3으로 가게 될 것이다.

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-httpbin
  namespace : egress
spec:
  hosts:
  - example.com
  exportTo:
  - "."
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS

exportTo 필드는 이 서비스 엔트리 진입점을 인식하는 네임스페이스를 제한할 수 있다.
위 예시는 egress 네임스페이스에서만 사용할 수 있도록 한다.

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-dns
spec:
  hosts:
  - foo.bar.com
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  endpoints:
  - address: us.foo.bar.com
    ports:
      http: 8080
  - address: uk.foo.bar.com
    ports:
      http: 9080
  - address: in.foo.bar.com
    ports:
      http: 7080

엔드포인트로 도메인을 지정하는 것도 가능하다.
이 경우 HTTP_PROXY=http://localhost/ 환경변수를 둔 상태로 foo.bar.com에 요청을 하게 되면 세 엔드포인트 중 하나로 가게 된다고 한다.
(문서만 봤을 때는 잘 와닿지 않아서 테스트해봐야겠다.)

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: details-svc
spec:
  hosts:
  - details.bookinfo.com
  location: MESH_INTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: STATIC
  workloadSelector:
    labels:
      app: details

프록시가 세팅되지 않은 클러스터의 워크로드에 대한 진입점을 등록할 때 workloadSelector를 써주면 유용하다.

관련 문서

이름 noteType created
25.05 테크니컬 라이팅 area 2025-05-07
Envoy knowledge 2025-04-07
Istio Telemetry knowledge 2025-04-08
Istio Gateway knowledge 2025-04-16
Istio ServiceEntry knowledge 2025-04-17
Istio VirtualService knowledge 2025-04-21
Istio DestinationRule knowledge 2025-04-21
Istio EnvoyFilter knowledge 2025-04-21
Istio WasmPlugin knowledge 2025-04-21
아르고 롤아웃과 이스티오 연계 knowledge 2025-04-22
pilot-agent knowledge 2025-04-28
Kiali knowledge 2025-04-28
Istio PeerAuthentication knowledge 2025-05-04
Istio RequestAuthentication knowledge 2025-05-04
Istio AuthorizationPolicy knowledge 2025-05-04
Istio Operator knowledge 2025-05-09
istioctl knowledge 2025-05-12
Istio Sidecar knowledge 2025-05-13
Istio ProxyConfig knowledge 2025-05-17
istiod knowledge 2025-05-18
사이드카 모드 knowledge 2025-05-18
메시 배포 모델 knowledge 2025-05-21
Istio WorkloadGroup knowledge 2025-05-26
Istio WorkloadEntry knowledge 2025-05-26
앰비언트 모드 knowledge 2025-06-02
책 내용 정리 project 2025-04-03
스터디 내용 사전 정리 project 2025-04-03
1주차 - istio 소개, 첫걸음 project 2025-04-06
2주차 - 엔보이, 게이트웨이 project 2025-04-13
3주차 - 트래픽 관리 project 2025-04-19
3주차 - 네트워크 복원력 project 2025-04-23
4주차 - 이스티오 관측가능성 project 2025-04-27
5주차 - 통신 보안 project 2025-05-04
6주차 - 디버깅 project 2025-05-11
7주차 - 스케일링, 멀티 클러스터 project 2025-05-18
1W - 서비스 메시와 이스티오 published 2025-04-10
1W - 간단한 장애 상황 구현 후 대응 실습 published 2025-04-10
1W - Gateway API를 활용한 설정 published 2025-04-10
1W - 네이티브 사이드카 컨테이너 이용 published 2025-04-10
2W - 인그레스 게이트웨이 실습 published 2025-04-17
2W - 엔보이 published 2025-04-19
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 published 2025-04-26
4W - 이스티오 메트릭 확인 published 2025-05-03
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 published 2025-05-03
4W - 번외 - 트레이싱용 심플 메시 서버 개발 published 2025-05-03
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 published 2025-05-03
5W - 이스티오 mTLS와 SPIFFE published 2025-05-11
5W - 이스티오 JWT 인증 published 2025-05-11
5W - 이스티오 인가 정책 설정 published 2025-05-11
6W - 이스티오 설정 트러블슈팅 published 2025-05-18
6W - 이스티오 컨트롤 플레인 성능 최적화 published 2025-05-18
8W - 가상머신 통합하기 published 2025-06-01
8W - 엔보이와 iptables 뜯어먹기 published 2025-06-01
9W - 앰비언트 모드 구조, 원리 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 published 2025-06-07
7W - 이스티오 메시 스케일링 published 2025-06-09
7W - 엔보이 필터를 통한 기능 확장 published 2025-06-09
이스티오 스케일링 topic 2025-05-18
엔보이에 와즘 플러그인 적용해보기 topic 2025-06-09
E-이스티오 설정 트러블슈팅하기 topic/explain 2025-05-18
E-이스티오 컨트롤 플레인 성능 최적화 topic/explain 2025-05-18
E-이스티오 컨트롤 플레인 메트릭 topic/explain 2025-05-18
E-이스티오의 데이터 플레인 트래픽 세팅 원리 topic/explain 2025-05-27
E-deb 파일 뜯어보기 topic/explain 2025-06-01
E-이스티오 DNS 프록시 동작 topic/explain 2025-06-01
E-이스티오 가상머신 통합 topic/explain 2025-06-01
E-이스티오에서 엔보이 기능 확장하기 topic/explain 2025-06-01
E-앰비언트 모드 헬름 세팅 topic/explain 2025-06-03
E-앰비언트 ztunnel 트래픽 경로 분석 topic/explain 2025-06-07
E-앰비언트 모드에서 메시 기능 활용 topic/explain 2025-06-07
E-이스티오 메시 스케일링 topic/explain 2025-06-08
E-istio-csr 사용 실습 topic/explain 2025-06-09
I-다른 네임스페이스 같은 포트 리스닝 서버 구현 topic/idea 2025-06-07
I-ztunnel이 다른 네임스페이스에서 요청 보내는 코드 분석 topic/idea 2025-06-07
T-엔보이 실습 with solo.io topic/temp 2025-04-14

참고


  1. https://istio.io/latest/docs/reference/config/networking/service-entry/ ↩︎